//+------------------------------------------------------------------+
//|                                       Kolier_SuperTrend_Indi.mq4 |
//|                                       Copyright 2010, KoliEr Li. |
//|                                                 http://kolier.li |
//+------------------------------------------------------------------+
/*
 * I here get paid to program for you. Just $15 for all scripts.
 *
 * I am a bachelor major in Financial-Mathematics.
 * I am good at programming in MQL for Meta Trader 4/5 platform. Senior Level. Have done hundreds of scripts.
 * No matter what it is, create or modify any indicators, expert advisors and scripts.
 * I will ask these jobs which are not too large, price from $15, surely refundable if you are not appreciate mine.
 * All products will deliver in 3 days.
 * Also, I am providing EA, Indicator and Trade System Improvement Consultant services, contact me for the detail.
 * If you need to have it done, don't hesitate to contact me at: kolier.li@gmail.com
 */

//+------------------------------------------------------------------+
//| Indicator Properties                                             |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, KoliEr Li."
#property link      "http://kolier.li"
// Client: 
// Tags: SuperTrend, ATR
// Revision: 8

/* Change Logs */
/*
2. 1.0.2(2011-04-06) Fix some repaint trail.
3. 1.0.3(2011-05-26) Add SetIndexDrawBegin() to be EA friendly. 
4. 2.0.4(2011-08-01) Use main line to restruct the implementation.
5. 2.1.5(2011-09-01) Export for EA trading.
6. 2.1.6(2011-09-02) Make GlobalVariable unique to avoid conflicts.
7. 2.1.7(2011-09-02) Fix minor bugs.
8. 2.1.8(2012-02-29) Fine tune the trend mode 1 implementation.
*/

#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 White
#property indicator_color2 Lime
#property indicator_color3 Red
#property indicator_width1 1
#property indicator_width2 2
#property indicator_width3 2
 
//+------------------------------------------------------------------+
//| Universal Constants                                              |
//+------------------------------------------------------------------+
#define PHASE_NONE 0
#define PHASE_BUY 1
#define PHASE_SELL -1

//+------------------------------------------------------------------+
//| User input variables                                             |
//+------------------------------------------------------------------+
extern string    AdvisorName = "Kolier_SuperTrend_Indi";
extern string AdvisorVersion = "2.1.8";            // The version number of this script
extern string    ProjectPage = "http://kolier.li/project/kolier-supertrend-indi";            // The project landing page
extern int       BarsToCount = 0;    // Set to 0 to count all bars, if >0, set more to calculate more bars
extern int         TrendMode = 0;    // 0=Show line same as SuperTrend.mq4, 1=New way to show trend line
extern bool        EA_Export = true; // Export value for EA to trade.
// iATR
extern string ATR_Indicator = "http://kolier.li/example/mt4-iatr-system-average-true-range";
extern int       ATR_Period = 10;
extern double ATR_Multiplier = 3.0;


//+------------------------------------------------------------------+
//| Universal variables                                              |
//+------------------------------------------------------------------+
double buffer_line_up[], buffer_line_down[], buffer_line_main[];
double atr, band_upper, band_lower;
string prefix="";

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorShortName(AdvisorName);
   IndicatorDigits(MarketInfo(Symbol(), MODE_DIGITS));
   
   SetIndexBuffer(0, buffer_line_main);
   SetIndexLabel(0, "SuperTrend");
   SetIndexBuffer(1, buffer_line_up);
   SetIndexLabel(1, "Up Trend");
   SetIndexBuffer(2, buffer_line_down);
   SetIndexLabel(2, "Down Trend");
   
   
   SetIndexDrawBegin(0, ATR_Period);
   
   prefix = AdvisorName+"_"+Symbol()+"_"+Period()+"_"+TrendMode+"_"+ATR_Period+"_"+DoubleToStr(ATR_Multiplier,2);
   
   return(0);
  }
  
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   GlobalVariablesDeleteAll(AdvisorName);
  
   return(0);
  }
  
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int bars_counted = IndicatorCounted();
   if(bars_counted < 0) {
      return(1);
   }
   else if(bars_counted > 0) {
      bars_counted--;
   }
   int limit = Bars - bars_counted;
   if(BarsToCount>0 && limit>BarsToCount) {
      limit = BarsToCount;
   }
   
   int i;
   for(i=limit; i>=0; i--) {
      atr = iATR(Symbol(), 0, ATR_Period, i);
      band_upper = (High[i]+Low[i])/2 + ATR_Multiplier * atr;
      band_lower = (High[i]+Low[i])/2 - ATR_Multiplier * atr;
            
      if(buffer_line_main[i+1]==EMPTY_VALUE) {
         buffer_line_main[i] = (High[i+1]+Low[i+1])/2;
      }
      // PHASE UP
      if(Close[i]>buffer_line_main[i+1] && buffer_line_main[i+1]!=EMPTY_VALUE) {
         if(buffer_line_main[i] == EMPTY_VALUE) {
            if(TrendMode == 1) {
               if(band_lower>buffer_line_main[i+1]) {
                  buffer_line_main[i] = band_lower;
               }
               else {
                  buffer_line_main[i] = buffer_line_main[i+1];
               }
            }
            else if(TrendMode == 0) {
               if(Close[i+1]>=buffer_line_main[i+1]) {
                  if(band_lower>buffer_line_main[i+1]) {
                     buffer_line_main[i] = band_lower;
                  }
                  else {
                     buffer_line_main[i] = buffer_line_main[i+1];
                  }
               }
               else if(Close[i+1]<buffer_line_main[i+1]) {
                  buffer_line_main[i] = band_lower;
               }
            }
         }
         else if(Close[i+1]>buffer_line_main[i+1]) {
            if(band_lower>buffer_line_main[i+1]) {
               buffer_line_main[i] = band_lower;
            }
            else {
               buffer_line_main[i] = buffer_line_main[i+1];
            }
         }
         else if(Close[i+1]<buffer_line_main[i+1]) {
            if(TrendMode == 1) {
               if(band_lower>buffer_line_main[i+1]) {
                  buffer_line_main[i] = band_lower;
               }
               else {
                  buffer_line_main[i] = buffer_line_main[i+1];
               }
            }
            else if(TrendMode == 0) {
               buffer_line_main[i] = band_lower;
            }
         }
         buffer_line_up[i] = buffer_line_main[i];
         buffer_line_up[i+1] = buffer_line_main[i+1];
         if(buffer_line_down[i]!=EMPTY_VALUE) {
            buffer_line_down[i] = EMPTY_VALUE;
         }
      }
      // PHASE DOWN
      if(Close[i]<buffer_line_main[i+1] && buffer_line_main[i+1]!=EMPTY_VALUE) {
         if(buffer_line_main[i] == EMPTY_VALUE) {
            if(TrendMode == 1) {
               if(band_upper<buffer_line_main[i+1]) {
                  buffer_line_main[i] = band_upper;
               }
               else {
                  buffer_line_main[i] = buffer_line_main[i+1];
               }
            }
            else if(TrendMode == 0) {
               if(Close[i+1]<buffer_line_main[i+1]) {
                  if(band_upper<buffer_line_main[i+1]) {
                     buffer_line_main[i] = band_upper;
                  }
                  else {
                     buffer_line_main[i] = buffer_line_main[i+1];
                  }
               }
               else if(Close[i+1]>buffer_line_main[i+1]) {
                  buffer_line_main[i] = band_upper;
               }
            }
         }
         else if(Close[i+1]<buffer_line_main[i+1]) {
            if(band_upper<buffer_line_main[i+1]) {
               buffer_line_main[i] = band_upper;
            }
            else {
               buffer_line_main[i] = buffer_line_main[i+1];
            }
         }
         else if(Close[i+1]>buffer_line_main[i+1]) {
            if(TrendMode == 1) {
               if(band_upper<buffer_line_main[i+1]) {
                  buffer_line_main[i] = band_upper;
               }
               else {
                  buffer_line_main[i] = buffer_line_main[i+1];
               }
            }
            else if(TrendMode == 0) {
               buffer_line_main[i] = band_upper;
            }
         }
         buffer_line_down[i] = buffer_line_main[i];
         buffer_line_down[i+1] = buffer_line_main[i+1];
         if(buffer_line_up[i]!=EMPTY_VALUE) {
            buffer_line_up[i] = EMPTY_VALUE;
         }
      }
   }
   
   if(EA_Export) {
      for(i=0; i<3; i++) {
         if(buffer_line_main[i]!=EMPTY_VALUE) {
            GlobalVariableSet(prefix+"_Main_"+i, buffer_line_main[i]);
         }
         else {
            GlobalVariableSet(prefix+"_Main_"+i, 0);
         }
         if(buffer_line_up[i]!=EMPTY_VALUE) {
            GlobalVariableSet(prefix+"_Up_"+i, buffer_line_up[i]);
         }
         else {
            GlobalVariableSet(prefix+"_Up_"+i, 0);
         }
         if(buffer_line_down[i]!=EMPTY_VALUE) {
            GlobalVariableSet(prefix+"_Down_"+i, buffer_line_down[i]);
         }
         else {
            GlobalVariableSet(prefix+"_Down_"+i, 0);
         }
      }
   }
  
   return(0);
  }